package com.yqg.protection.netty.encode;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Hex;

import java.util.List;

@Slf4j
public class Sdf300FrameDecoder extends ByteToMessageDecoder {
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) {
        // 确保至少有 HEADER(1) + LEN(2) 字节
        if (in.readableBytes() < 3) {
            return;
        }

        in.markReaderIndex(); // 标记初始位置

        // 读取并验证帧头
        byte header = in.readByte();
        if (header != (byte) 0xFE) {
            in.resetReaderIndex();
            ctx.close();
            return;
        }

        // 修正1：使用大端序读取LEN（2字节），匹配字段定义的"00 44"→68
        short len = in.readShort(); // 等价于 readShortBE()，正确解析大端序长度

        // 完整帧总长度 = HEADER(1) + LEN(2) + DATA(len) + CRC(2)
        int totalFrameLength = 1 + 2 + len + 2;

        // 修正2：检查缓冲区是否有足够的完整帧字节（从初始位置开始计算）
        if (in.readableBytes() + 3 < totalFrameLength) { // 已读取3字节（HEADER+LEN），需加上剩余可读字节判断
            in.resetReaderIndex();
            return;
        }

        // 修正3：从初始位置读取完整帧（包含HEADER+LEN+DATA+CRC）
        in.resetReaderIndex();
        ByteBuf frame = in.readRetainedSlice(totalFrameLength);

        // 转换为十六进制字符串
        byte[] frameBytes = new byte[frame.readableBytes()];
        frame.readBytes(frameBytes);
        String hexString = Hex.encodeHexString(frameBytes);
        frame.release();

        log.info("收到完整FE协议数据: {}", hexString);
        out.add(hexString);
    }
}
